package com.example.treeutil.layer;


import java.util.List;
import java.util.Optional;

/**
 * 2024/12/13
 * 返给前端的对象
 * @author fengyu
 */
public interface TreeNode<ID, PID, T> {
    /**
     * 前端靠这个属性识别树结构的枝或叶
     * @return 目录或图层
     */
    default String getType() {
        Class<? extends TreeNode> cls = this.getClass();
        if (cls.isAnnotationPresent(NodeType.class)) {
            NodeType nt = cls.getAnnotation(NodeType.class);
            return nt.value().name();
        } else {
            return cls.getSimpleName();
        }
    }

    ID getId();
    PID getPId();
    List<T> getSubs();
    int getIndex();

    /**
     * 根据实际情况重载此判断的方法
     * @return true有上级目录，否则没有上级目录
     */
    default boolean hasParent() {
        PID pid = getPId();
        if (null == pid) return false;
        if (pid instanceof String) {
            return ((String) pid).length() > 0;
        }
        return true;
    }
    default void addChild(T child){
        Optional.ofNullable(getSubs()).ifPresent(subs->subs.add(child));}

    static void setChilds(TreeNode a, List<TreeNode> list) {
        list.forEach(a::addChild);
    }
}
